Unix 文件权限

st_mode 是一个 16 位的二进制数, 文件权限类型和权限被编码在这个数中

 sgid sticky
           \    |   /
   type     \   |  /   user      group    other
 +--------+  |  |  |  +------  +------  +------
 |        |  |  |  |  |        |        |
[ ][ ][ ][ ][u][g][s][r][w][x][r][w][x][r][w][x]

其中前4位作为文件类型, 最多可以标识16种类型, 目前已经使用了其中7个.

接下来的3位是文件的特殊属性, 1代表具有某个属性, 0 代表没有, 这3位分别是 set-user-ID位, set-group-ID位和 sticky 位

最后9位是许可权限, 分为3组, 对应3种用户, 他们的文件所有者, 同组用户和其他用户. 其他用户指与用户不在用一个组的人. 每组3位, 分别代表读写和执行权限.1代表有, 0代表没有.

掩码

子域掩码(subfield coding)是系统编程中一种重要且常用的技术

掩码的概念

掩码将不需要的字段设0, 需要的字段值不发生改变

整数是bit组成的序列

整数在计算机中是以 bit 序列的形式存在

掩码技术

与 0 做位与(&)操作可以将相应的 bit 置为0

使用八进制数

直接处理二进制数是很枯燥乏味的.一种简化方法是将二进制数的每三位分为一组来操作, 这就是八进制(0~7)

三个特殊位

结构 stat 中的 st_mode 成员包含16位, 其中4位用作文件类型, 9位用作许可权限, 剩下的3位用作文件特殊属性

set-user-ID 位

SUID 位告诉内核 运行这个程序的时候认为是由文件所有者在运行这个程序

SUID 位用来给某些程序提供额外的权限

可以通过 <sys/stat.h> 中定义的掩码来校验某一个程序是否有 SUID 位

#define     S_ISUID     0004000     /* set user ID on execution */

set-group-ID 位

第二个特殊属性位用来设置程序运行时所属组

可以通过 <sys/stat.h> 中定义的掩码来校验某一个程序是否有 set-group-ID 位

#define     S_ISGID 0002000     /* set group ID on execution. */

sticky 位

sticky 位对于文件和目录有不同的用途.

对于文件而言早期的Unix系统内核中, sticky 位告诉内核即使没人在使用程序, 也要把它放在交换空间中.

对于目录而言 sticky 的含义是不同的, 有些目录被设计用来存放临时文件, 如tmp, 谁都可以往这里创建/删除文件, sticky位使得目录里的文件只能 被创建者删除.